package main

import "fmt"

// interface{}是一个万能类型，即元类型（类似Object），所有基本类型都实现了interface{}，因此interface{}作为形参，实参可以传任意类型
func myFunc(arg interface{}) {
	fmt.Println("myFunc is called...")
	fmt.Println(arg)

	// interface{} 通过断言方式判，来区分此时引用的底层数据类型到底是什么
	// 本语法含义，判断arg所指变量是否为string类型。返回参数value,bool，如果是string，bool为true，value为arg值
	var value, ok = arg.(string)
	if !ok {
		fmt.Println("arg is not string type")
	} else {
		fmt.Println("arg is string type. value = ", value)
		fmt.Printf("value type is %T\n", value)
	}
}

type Book struct {
	auth string
}

func main() {
	book := Book{"Golang"}
	myFunc(book)
	myFunc(100)
	myFunc("abc")
}
